import configuration from './configuration'
import { ConfigModule } from '@nestjs/config'
import { SharedModule } from './shared/shared.module'
import { AuthModule } from './modules/auth/auth.module'
import { Module, ValidationPipe } from '@nestjs/common'
import { SystemModule } from './modules/system/system.module'
import { MonitorModule } from './modules/monitor/monitor.module'
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'
import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core'
import { AuditInterceptor, ResponseInterceptor, AllExceptionsFilter, DatabaseModule, TokenModule, JwtAuthGuard, PermissionAuthGuard } from './common'

/**
 * 用的根模块，所有其他模块都是它的子模块，根模块是 NestJS 应用程序的入口点
 */
@Module({
  imports: [
    ConfigModule.forRoot({ load: [configuration], isGlobal: true, cache: true }), // 配置环境变量
    ThrottlerModule.forRoot([{ name: 'global', ttl: 10 * 1000, limit: 8 }]), // 导入速率限制模块
    DatabaseModule, // 数据库连接模块 src\common\module\database.module.ts
    SharedModule, // 全局共享模块 src\shared\shared.module.ts
    TokenModule, // Jwt 权限认证配置模块 src\common\module\token.module.ts
    AuthModule, // 权限登录模块 src\modules\auth\auth.module.ts
    SystemModule, // 系统数据管理模块 src\modules\system\system.module.ts
    MonitorModule, // 系统服务监控模块 src\modules\monitor\monitor.module.ts
  ],

  providers: [
    // 限制接口请求频率，防止滥用
    { provide: APP_GUARD, useClass: ThrottlerGuard },
    // 资源访问 Token 凭证权限校验守卫
    { provide: APP_GUARD, useClass: JwtAuthGuard },
    // 接口访问权限守卫 | 检查用户是否有权限访问当前接口
    { provide: APP_GUARD, useClass: PermissionAuthGuard },
    // 全局验证管道：自动过滤多余参数（whitelist）并转换数据类型（transform）
    { provide: APP_PIPE, useValue: new ValidationPipe({ whitelist: true, transform: true }) },
    // 捕获应用中所有未处理的异常，返回标准化错误响应 | 全局过滤器的优先级高于拦截器，异常发生时会直接进入过滤器处理，不会执行后续拦截器
    { provide: APP_FILTER, useClass: AllExceptionsFilter },
    // 自动填充创建人、更新人信息
    { provide: APP_INTERCEPTOR, useClass: AuditInterceptor },
    // 该拦截器会对应用中所有接口的响应进行统一处理（如包装响应格式、添加耗时统计）
    { provide: APP_INTERCEPTOR, useClass: ResponseInterceptor },
  ],
})
export class AppModule {}
